#include "./BSP/KEY/key.h"
#include "./SYSTEM/delay/delay.h"


/**
 * @brief       按键初始化函数
 * @note        上拉，按键要接地
 * @param       无
 * @retval      无
 */
void key_init(void)
{
    GPIO_InitTypeDef gpio_init_struct;
    KEYA4_GPIO_CLK_ENABLE();                                   /* KEYA4时钟使能 */


    gpio_init_struct.Pin = KEYA4_GPIO_PIN;                     /* KEYA4引脚 */
    gpio_init_struct.Mode = GPIO_MODE_INPUT;                    /* 输入 */
    gpio_init_struct.Pull = GPIO_PULLUP;                        /* 上拉 */
    gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;              /* 高速 */
    HAL_GPIO_Init(KEYA4_GPIO_PORT, &gpio_init_struct);




}

/**
 * @brief       按键扫描函数
 * @param       mode:0 / 1, 具体含义如下:
 *   @arg       0,  不支持连续按（当按键按下不放时，只有第一次调用会返回键值，
 *                  必须松开以后，再次按下才会返回其他键值）
 *   @arg       1,  支持连续按（当按键按下不放时，每次调用该函数都会返回键值）
 * @retval      键值，定义如下:
 *              KEYA4_PRES, 1, KEYA4按下
 */
uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1;  /* 按键松开标志 */
    uint8_t keyval = 0;

    if (mode) key_up = 1;       /* 支持连按 */

    if (key_up && (KEYA4 == 0 ))  /* 按键松开标志为1，且有任意一个按键按下了 */
    {
        delay_ms(10);           /* 消抖 */
        key_up = 0;

        if (KEYA4 == 0)  keyval = KEYA4_PRES;

    }
    else if (KEYA4 == 1 ) /* 没有任何按键按下，标记按键松开 */
    {
        key_up = 1;
    }

    return keyval;              /* 返回键值 */
}




















